#ifndef MATH_ERROR_THROW_STRUCTDATAVECTOR
#define MATH_ERROR_THROW_STRUCTDATAVECTOR

#include <iostream>
#include "Throw_MathSpecialization.hpp"



namespace Math
{

namespace E_Math
{

template <typename T, typename K = T>
class EXCStructDataVector : public EXCMath<T,K>
    {
        public:
            ~EXCStructDataVector() { delete error_pointer; }
            EXCStructDataVector(const EXCStructDataVector<T,K>& copy) = delete;
            EXCStructDataVector() = delete;
            EXCStructDataVector(EXCStructDataVector<T,K>&& move)
              {
                  error_pointer      = move.error_pointer;
                  move.error_pointer = nullptr;
              }
            EXCStructDataVector(const StructDataVector<T,K>* epointer)
              {
                  if(epointer == nullptr || epointer ==  NULL) error_pointer = nullptr;
                    else error_pointer = new StructDataVector<T,K>(*epointer);
              }

            const StructDataVector<T,K>* Geterror_pointer()   const   { return error_pointer; }


        private:
            const StructDataVector<T,K>* error_pointer;
    };




template <typename T, typename K = T>
class IndexIsTooHighStructDataVector : public EXCStructDataVector<T,K>, public IndexIsTooHigh<T,K> 
    {
        public:
            ~IndexIsTooHighStructDataVector() {}
            IndexIsTooHighStructDataVector(const IndexIsTooHighStructDataVector<T,K>& copy) = delete;
            IndexIsTooHighStructDataVector() = delete;
            IndexIsTooHighStructDataVector(IndexIsTooHighStructDataVector<T,K>&& move):
              EXCStructDataVector<T,K>((IndexIsTooHighStructDataVector<T,K>&&)move)
              {}
            IndexIsTooHighStructDataVector(const StructDataVector<T,K>* epointer, const char* const str):
              EXCStructDataVector<T,K>(epointer)
              {
                  #ifdef DISPERROR_MATH_VECTOR_IndexIsTooHighStructDataVector
                  std::cout << str;
                  #endif
              }
    };



/*
template <typename T, typename K = T>
class CoordIsNullptr : public EXCStructDataVector<T,K>, public IsNullptr<T,K>
    {
            ~CoordIsNullptr() {}
            CoordIsNullptr(const CoordIsNullptr<T,K>& copy) = delete;
            CoordIsNullptr(CoordIsNullptr<T,K>&& move):
              EXCStructDataVector<T,K>((CoordIsNullptr<T,K>&&)move)
              {} 
            CoordIsNullptr(const StructDataVector<T,K>* epointer, const char* const str):
              EXCStructDataVector<T,K>(epointer)
              {
                  #ifdef DISPERROR_MATH_VECTOR_CoorIsNullptr
                  std::cout << str;
                  #endif
              }

    };

*/
} // end namespace E_Math
} // end namespace Math



#endif
